<?php

// 获取客户端IP地址
function get_client_ip() {
    $ipaddress = '';
    // 首先检查 REMOTE_ADDR
    if (isset($_SERVER['REMOTE_ADDR'])) {
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (isset($_SERVER['HTTP_X_FORWARDED'])) {
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    } elseif (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    } elseif (isset($_SERVER['HTTP_FORWARDED'])) {
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    } else {
        $ipaddress = 'UNKNOWN';
    }
    return $ipaddress;
}

// 存储 POST 和 GET 数据的函数
function store_ip_data($basePath) {
    $ip = get_client_ip();
    $filePath = $basePath. '/ip_value/'. $ip. '.txt'; // 将文件存储在 ip_value 目录中
    $checkFilePath = $basePath. '/ip_check/'. $ip. '.txt'; // 存储检查结果的文件路径

    // 合并 $_GET 和 $_POST 数据
    $combined = array_merge($_GET, $_POST);

    // 检查存储数据的目录是否存在，若不存在则创建
    $directory = $basePath. '/ip_value';
    if (!is_dir($directory)) {
        mkdir($directory, 0777, true);
    }
    // 检查 ip_check 目录是否存在，若不存在则创建
    $checkDirectory = $basePath. '/ip_check';
    if (!is_dir($checkDirectory)) {
        mkdir($checkDirectory, 0777, true);
    }

    // 打开文件，如果文件不存在会创建
    $file = fopen($filePath, 'a');
    if ($file) {
        foreach ($combined as $key => $value) {
            // 将数据存储到文件中，每个数据后加换行符
            fwrite($file, $key. ': '. $value. PHP_EOL);
        }
        fclose($file);
    } else {
        echo "无法打开存储数据的文件";
        return;
    }

    // 检查 ip_check 中的文件内容是否为 2，如果是则拦截访问
    check_ip_status($ip);

    // 检查是否包含敏感字符
    $isSensitive = false; // 标志位，用于标记是否包含敏感字符
    $sensitiveChars = array('<', '"', "'", 'php', 'select', '(', ')', '[', ']', 'eval', '*', ':');
    $ipValueFileContent = file_get_contents($filePath); // 直接读取 ip_value 对应 IP 文件的内容
    foreach ($sensitiveChars as $char) {
        if (strpos($ipValueFileContent, $char)!== false) {
            $isSensitive = true;
            break;
        }
    }

    // 先检查文件是否存在，若存在，以只读方式打开，若内容为 2，拦截访问
    if (file_exists($checkFilePath)) {
        $checkFile = fopen($checkFilePath, 'r');
        $content = fread($checkFile, filesize($checkFilePath));
        if (trim($content) == '2') {
            die("ip block!!!!");
        }
        fclose($checkFile);
    }

    // 打开检查文件，如果文件不存在会创建
    $checkFile = fopen($checkFilePath, 'w');
    if ($checkFile) {
        // 先读取文件内容
        $content = '';
        if (file_exists($checkFilePath)) {
            $content = file_get_contents($checkFilePath);
        }
        if ($isSensitive) {
            fwrite($checkFile, '1'); // 若包含敏感字符，将检查文件内容写为 1
        } else {
            // 若文件内容已经为 1，则不修改为 0
            if (trim($content) == '1') {
                fwrite($checkFile, '1');
            } else {
                fwrite($checkFile, '0');
            }
        }
        fclose($checkFile);
    } else {
        echo "无法打开检查文件";
    }

    // 再次检查 ip_check 中的文件内容是否为 2，如果是则拦截访问
    check_ip_status($ip);
}

// 检查 IP 状态的函数
function check_ip_status($ip) {
    $checkFilePath = $basePath. '/ip_check/'. $ip. '.txt';
    if (file_exists($checkFilePath)) {
        $content = file_get_contents($checkFilePath);
        if (trim($content) == '2') {
            die("ip block!!!!");
        }
    }
}

// 调用存储数据的函数
$basePath = '/var/www/html/ip_span'; // 可修改为不同的路径
store_ip_data($basePath);